package com.moonLight.weblog.jwt.service;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.moonLight.weblog.common.domain.dos.UserDo;
import com.moonLight.weblog.common.domain.dos.UserRoleDo;
import com.moonLight.weblog.common.domain.mapper.UserMapper;
import com.moonLight.weblog.common.domain.mapper.UserRoleMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 1.加载用户信息： 从数据源中加载用户的用户名、密码和角色等信息。
 * 2.创建 UserDetails 对象： 根据加载的用户信息，创建一个 Spring Security 所需的 UserDetails 对象，包含用户名、密码、角色和权限等。
 * UserDetails 该对象是Spring Security 的核心接口，用于封装用户信息，包括用户名、密码、角色和权限等信息。
 */
@Service
@Slf4j
public class UserDetailServiceImpl implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private UserRoleMapper userRoleMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 从数据库中查询
        UserDo userDO = userMapper.findByUsername(username);

        // 判断用户是否存在
        if (Objects.isNull(userDO)) {
            throw new UsernameNotFoundException("该用户不存在");
        }
        //根据username 查询用户角色 将符合username的角色都查到 转成权限角色对应的数字后 设置到User的角色中去
        List<UserRoleDo> roleDOS = userRoleMapper.findByUserName(userDO.getUsername());

        String[] roleArr = null;
        if (!CollectionUtils.isEmpty(roleDOS)){
            List<String> roles = roleDOS.stream().map(item -> item.getRole()).collect(Collectors.toList());
            roleArr = roles.toArray(new String[roles.size()]);

        }

        log.info("登录的用户角色：{}",roleArr);

        // authorities 用于指定角色，这里写死为 ADMIN 管理员
        return User.withUsername(userDO.getUsername())
                .password(userDO.getPassword())
                .authorities(roleArr)
                .build();
    }


    public UserDetails loadUserByEmail(String email) throws UsernameNotFoundException {
        return null;
    }

//        // 从数据库中查询
//        // ...
//
//		// 暂时先写死，密码为 quanxiaoha, 这里填写的密文，数据库中也是存储此种格式
//		// authorities 用于指定角色，这里写死为 ADMIN 管理员
//        return User.withUsername("quanxiaoha")
//                .password("$2a$10$n7RJ1q.RnXx5M3O6B0i0he04fZOPjIJpyWcKuicW1bFyFHWhlGose")
//                .authorities("ADMIN")
//                .build();
//    }
}
